package org.monster.context.core.parameter;

import org.monster.context.core.communicator.ApplicationServletOutputSteam;

import javax.servlet.ServletOutputStream;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;

/**
 * Http响应
 *
 * @author Monster
 */
public class HttpResponse implements HttpServletResponse, ServletResponse {

    /**
     * 内容类型
     */
    protected String contentType;
    /**
     * 协议
     */
    protected String protocol;
    /**
     * 输出
     */
    protected PrintWriter out;
    /**
     * 输入
     */
    protected OutputStream output;
    /**
     * mime类型
     */
    protected String mime;
    /**
     * 字符串编码
     */
    protected String characterEncoding;
    /**
     * 内容长度
     */
    protected int contentLength;
    /**
     * 本地
     */
    protected Locale locale = Locale.getDefault();
    /**
     * 状态码
     */
    protected int stateCode;

    /**
     * 构造方法
     *
     * @param os 输出流
     */
    public HttpResponse(OutputStream os) {
        this.output = os;
        out = new PrintWriter(new OutputStreamWriter(os));
    }

    /**
     * 获取 多媒体互联网格式
     *
     * @return 多媒体互联网格式
     */
    public String getMime() {
        return mime;
    }

    /**
     * 设置 多媒体互联网格式
     *
     * @param mime 多媒体互联网格式
     */
    public void setMime(String mime) {
        this.mime = mime;
    }

    /**
     * 获取 协议
     *
     * @return 协议
     */
    public String getProtocol() {
        return protocol;
    }

    /**
     * 设置 协议
     *
     * @param protocol 协议
     */
    public void setProtocol(String protocol) {
        this.protocol = protocol;
    }

    /**
     * 获取 内容类型
     *
     * @return 内容类型
     */
    @Override
    public String getContentType() {
        return contentType;
    }

    /**
     * 设置 内容类型
     *
     * @param contentType 内容类型
     */
    @Override
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    /**
     * 未找到
     * 若请求文件文件不存在时，返回404页面
     */
    public void toNotFound() {
        stateCode = 404;
        String content = "<html>" + "<head>" + "<title>404</title>" + "</head>"
                + "<body><h1>Error! 404 File Not Found</h1></body>" + "</html>";
        contentLength = content.length() + 2;
        out.println(getProtocol() + " " + getStatus() + " Not Found");
        out.println(getContentType());
        out.println("Content-Length: " + contentLength);
        out.println("");
        out.println(content);
        out.flush();
    }

    /**
     * 发送资源
     * 若请求的文件存在，则响应资源发送回浏览器解析
     *
     * @param file
     * @throws IOException 输入输出异常
     */
    public void sendResource(File file) throws IOException {
        contentLength = (int) file.length();
        stateCode = 200;
        String date = new Date(System.currentTimeMillis()).toString();
        out.println(getProtocol() + " " + getStatus() + " OK");
        out.println("MIME_Version: 1.0");
        out.println("Content_Length: " + contentLength);
        out.println("Content-Type:" + getContentType());
        out.println("Last-Modified: " + date);
        out.println("Data: " + date);
        out.println("Server: Monster-1.0/1.1");
        out.println("");
        sendFile(file); // 发送文件
        out.flush();
    }

    /**
     * 发送 头
     */
    public void sendHeaders() {
        stateCode = 200;
        out.println(getProtocol() + " " + getStatus() + " OK");
        out.println("Connection: keep-alive");
        out.println("Content-Type: " + getContentType());
        out.println("Content-Length: " + contentLength);
        out.println("Date: " + new Date(System.currentTimeMillis()).toString());
        out.println("Server: Monster-1.0/1.1");
        out.println("");
        out.flush();
    }

    /**
     * 获取 写入器
     *
     * @return 写入器
     */
    @Override
    public PrintWriter getWriter() {
        return out;
    }

    /**
     * 发送文件
     * 发送指定资源文件发送到Web浏览器
     *
     * @param file 文件
     */
    private void sendFile(File file) throws IOException {
        FileReader reader = new FileReader(file);
        int length = (int) file.length();
        char[] buffer = new char[length];
        reader.read(buffer);
        out.write(buffer);
        out.flush();
        reader.close();
    }

    /**
     * 发送 流
     *
     * @param buf 缓冲器
     * @throws IOException           输入输出异常
     * @throws FileNotFoundException 文件未找到异常
     */
    public void sendStream(byte[] buf) throws IOException {
        BufferedOutputStream bufOutput = new BufferedOutputStream(
                output);
        bufOutput.write(buf);
        bufOutput.flush();
    }

    /**
     * 获取 服务者输出流
     *
     * @return 输出流
     * @throws IOException 输入输出异常
     */
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        ApplicationServletOutputSteam sos = new ApplicationServletOutputSteam(output);
        sos.setResponse(this);
        return sos;
    }

    /**
     * 获取 字符串编码
     *
     * @return 字符串编码
     */
    @Override
    public String getCharacterEncoding() {
        return characterEncoding;
    }

    /**
     * 设置 字符串编码
     *
     * @param characterEncoding 字符串编码
     */
    @Override
    public void setCharacterEncoding(String characterEncoding) {
        this.characterEncoding = characterEncoding;
    }

    /**
     * 获取 语言环境
     *
     * @return 语言环境
     */
    @Override
    public Locale getLocale() {
        return locale;
    }

    /**
     * 设置 语言环境
     *
     * @param locale 语言环境
     */
    @Override
    public void setLocale(Locale locale) {
        this.locale = locale;
    }

    /**
     * 设置 长度
     *
     * @param length 长度
     */
    @Override
    public void setContentLength(int length) {
        this.contentLength = length;
    }

    /**
     * 获取 状态
     *
     * @return 状态
     */
    @Override
    public int getStatus() {
        return stateCode;
    }

    /**
     * 设置 状态码
     *
     * @param code 状态码
     */
    @Override
    public void setStatus(int code) {
        this.stateCode = code;
    }

    /**
     * 刷新 缓冲器
     *
     * @throws IOException 输入输出异常
     */
    @Override
    public void flushBuffer() throws IOException {


    }

    /**
     * 获取 缓冲器大小
     *
     * @return 缓冲器大小
     */
    @Override
    public int getBufferSize() {

        return 0;
    }

    /**
     * 设置 缓冲器大小
     *
     * @param bufferSize 缓冲器大小
     */
    @Override
    public void setBufferSize(int bufferSize) {


    }

    /**
     * 是否 提交过
     *
     * @return 布尔
     */
    @Override
    public boolean isCommitted() {

        return false;
    }

    /**
     * 重置
     */
    @Override
    public void reset() {


    }

    /**
     * 重置 缓冲器
     */
    @Override
    public void resetBuffer() {


    }

    /**
     * 获取cookie
     *
     * @param cookie cookie
     */
    @Override
    public void addCookie(Cookie cookie) {


    }

    /**
     * 添加 日期头
     *
     * @param name 名称
     * @param time 时间戳
     */
    @Override
    public void addDateHeader(String name, long time) {


    }

    /**
     * 添加 头
     *
     * @param name  名称
     * @param value 值
     */
    @Override
    public void addHeader(String name, String value) {


    }

    /**
     * 添加 初始化头
     *
     * @param name  名称
     * @param value 值
     */
    @Override
    public void addIntHeader(String name, int value) {


    }

    /**
     * 包含 头
     *
     * @param name 名称
     * @return 布尔
     */
    @Override
    public boolean containsHeader(String name) {

        return false;
    }

    /**
     * 编码 重定向url
     *
     * @param url url
     * @return url
     */
    @Override
    public String encodeRedirectURL(String url) {

        return null;
    }

    /**
     * 编码 重定向url
     *
     * @param url url
     * @return url
     */
    @Override
    public String encodeRedirectUrl(String url) {

        return null;
    }

    /**
     * 编码 url
     *
     * @param url url
     * @return url
     */
    @Override
    public String encodeURL(String url) {

        return null;
    }

    /**
     * 编码 url
     *
     * @param url url
     * @return url
     */
    @Override
    public String encodeUrl(String url) {

        return null;
    }

    /**
     * 获取 头
     *
     * @param name 名称
     * @return 头
     */
    @Override
    public String getHeader(String name) {

        return null;
    }

    /**
     * 获取 头名称 集合
     *
     * @return 头名称 集合
     */
    @Override
    public Collection<String> getHeaderNames() {

        return null;
    }

    /**
     * 获取 头名称 集合
     *
     * @return 头名称 集合
     */
    @Override
    public Collection<String> getHeaders(String name) {

        return null;
    }

    /**
     * 发送 错误码
     *
     * @param errorCode 错误码
     * @throws IOException 输入输出异常
     */
    @Override
    public void sendError(int errorCode) throws IOException {


    }

    /**
     * 发送 错误
     *
     * @param errorCode    错误码
     * @param errorMessage 错误消息
     * @throws IOException 输入输出异常
     */
    @Override
    public void sendError(int errorCode, String errorMessage) throws IOException {


    }

    /**
     * 发送 重定向
     *
     * @param url url
     * @throws IOException 输入输出异常
     */
    @Override
    public void sendRedirect(String url) throws IOException {


    }

    /**
     * 设置 日期头
     *
     * @param name 名称
     * @param time 时间戳
     */
    @Override
    public void setDateHeader(String name, long time) {


    }

    /**
     * 设置 头
     *
     * @param name  名称
     * @param value 值
     */
    @Override
    public void setHeader(String name, String value) {


    }

    /**
     * 设置 初始化头
     *
     * @param name  名称
     * @param value 值
     */
    @Override
    public void setIntHeader(String name, int value) {


    }

    /**
     * 设置 状态
     *
     * @param code 状态码
     * @param desc 说明
     */
    @Override
    public void setStatus(int code, String desc) {


    }

}
